#  第九讲 将eason的按键单次控制改成持续方向控制
import pygame  # 导入pygame模块
import sys  # 导入sys模块


class RunMap(pygame.sprite.Sprite):  # 创建滚动地图类

    def __init__(self, map_x, map_y):  # 初始化地图的坐标和图片参数
        self.x = map_x  # 定义map_x为类的x轴坐标
        self.y = map_y  # 定义map_y为类的y轴坐标
        self.image = pygame.image.load("image/bg1.png")  # 读取地图图片到类的image变量中

    def map_rolling(self):  # 定义地图滚动函数
        if self.x <= -1000:  # 如果地图的x坐标小于-1000
            self.x = 1000  # 地图的x坐标更新为1000
        else:  # 否则
            self.x -= 5  # 每次循环地图向左移动5像素

    def map_update(self):  # 定义更新地图函数
        screen.blit(self.image, (self.x, self.y))  # 将地图的图片和坐标位置更新到屏幕上


class MySprite(pygame.sprite.Sprite): # 定义游戏精灵类

    def __init__(self, image_file, frame_number, axis_x, axis_y):
        # 初始化游戏精灵类，设置image_file、frame_number、axis_x、axis_y为类的参数
        pygame.sprite.Sprite.__init__(self)  # 初始化动画精灵
        self.mast_image = pygame.image.load(image_file)  # 获取图片
        self.rect = self.mast_image.get_rect()  # 获取矩形的坐标数据
        self.frame_rect = self.rect.copy()  # 拷贝一份self.rect的数据到self.frame_rect里面
        self.rect.x = axis_x  # axis_x作为矩形的x轴坐标
        self.rect.y = axis_y  # axis_y作为矩形的y轴坐标
        self.frame_rect.width /= frame_number
        # 拷贝的矩形的宽度等于精灵图片的宽度除以精灵的个数，这样算出一个矩形的宽度
        self.rect.width /= frame_number  # 单个矩形的宽度等于精灵图片的宽度除以精灵的个数。
        self.frame_number = frame_number  # 精灵序列图中精灵的个数
        self.image_number = 0  # 图片的计数变量

    def update(self):  # 定义滚动精灵函数
        if self.image_number < self.frame_number:  # 如果图片的计数变量小于精灵图片中的精灵个数
            self.frame_rect.x = (self.image_number % self.frame_number) * self.frame_rect.width
            # 用计数变量除以精灵个数取余的值乘以矩形的宽度作为单个精灵的x坐标值
            self.image_number += 1  # 图片计数变量加1
        else:  # 否则
            self.image_number = 0  # 图片计数变量归0
        self.image = self.mast_image.subsurface(self.frame_rect)
        # 单个精灵图像的坐标值等于获取到的矩形的坐标值，这样就可以切割出一个精灵图像


pygame.init()  # 游戏初始化
screen = pygame.display.set_mode((640, 480))  # 设置游戏窗口大小
pygame.display.set_caption("Eason快跑")  # 设置游戏窗口标题
background = pygame.image.load("image/bg_sky.png")  # 读取游戏的背景到background变量中

# eason的相关内容
eason = MySprite("image/eason.png", 4, 320, 350)
# eason继承精灵类，四个参数分别是精灵图片、精灵图片中精灵个数、x、y坐标值
sprite_group = pygame.sprite.Group()  # 创建一个精灵组
sprite_group.add(eason)  # 精灵组中添加eason
dragon = MySprite("image/dragon.png", 4, 100, 320)
# 怪兽继承精灵类，四个参数分别是精灵图片、精灵图片中精灵个数、x、y坐标值
sprite_group.add(dragon)  # 精灵组中添加怪兽
fcc_clock = pygame.time.Clock()  # 获取pygame的时钟
fps = 30  # 设置刷新率，数字越大刷新率越高，但因为示例图片只有4帧所以建议设低一点 否则闪的太凶。

# 创建地图对象
bg1 = RunMap(0, 0)  # 创建一个地图1的变量继承RunMap类，坐标为0,0
bg2 = RunMap(1000, 0)  # 比实际地图大小要小一点，否则会出现缝隙。

while True:  # 进入游戏主循环
    for event in pygame.event.get():
        # 使用event.get()方法只能检测按键单次动作，如果希望按下按键有持续动作，需要key.get_pressed()方法
        if event.type == pygame.QUIT:  # 如果监听到键盘的动作等于pygame的退出
            sys.exit()  # 退出游戏窗口

    keys = pygame.key.get_pressed()  # 该方法能检测键盘持续按下时的动作
    if keys[pygame.K_RIGHT]:   # 如果按键值等于pygame的向左按键，也就是键盘的向左键
        eason.rect.x += 10  # eason的坐标往左移10像素
    elif keys[pygame.K_LEFT]:  # 如果按键值等于pygame的向右按键，也就是键盘的向右键
        eason.rect.x -= 10  # eason的坐标往右移10像素
    elif keys[pygame.K_UP]:  # 如果按键值等于pygame的向上按键，也就是键盘的向上键
        eason.rect.y -= 10  # eason的坐标往上移10像素
    elif keys[pygame.K_DOWN]:  # 如果按键值等于pygame的向下按键，也就是键盘的向下键
        eason.rect.y += 10  # eason的坐标往下移10像素

    screen.blit(background, (0, 0))
    # 绘制一个有太阳的背景图片，或者绘制白色图片，否则滚动地图有虚影，而且这行代码要在bg1和bg2之前运行，否则会被覆盖

    bg1.map_update()  # 更新地图
    bg2.map_update()  # 更新地图2
    bg1.map_rolling()  # 滚动地图
    bg2.map_rolling()  # 滚动地图2

    sprite_group.update()  # 更新精灵组
    sprite_group.draw(screen)  # 将精灵组绘制到屏幕上
    fcc_clock.tick(fps)  # 设置游戏窗口刷新率为fps的值
    pygame.display.flip()  # 绘制窗口
